package sortingAdvance.quickSort;

/**
 * 插入排序
 * mxf
 * 2018年5月18日17:09:23
 */
public class InsertionSort {

    private InsertionSort(){}
    public static void sort(Comparable[] arr) {
        int length = arr.length;

        for(int i = 0; i < length; i++) {
            // 第一种写法
//            for(int j = i; j > 0; j--) {
//                if(arr[j - 1].compareTo(arr[j]) > 0) {
//                    swap(arr, j - 1, j);
//                }else {
//                    break;
//                }
//            }
            // 第二种写法
//            for(int j = i; j > 0 && arr[j - 1].compareTo(arr[j]) > 0; j--){
//                swap(arr, j - 1, j);
//            }

            // 第三种写法，避免每次比较都进行swap操作，而是比较之后一次赋值
            Comparable e = arr[i];
            int j;
            for(j = i; j > 0 && arr[j - 1].compareTo(e) > 0; j--) {
                arr[j] = arr[j - 1];
            }
            arr[j] = e;
        }

    }

    /**
     * arr [l, r]区间进行排序
     * @param arr
     * @param l
     * @param r
     */
    public static void sort(Comparable[] arr, int l, int r) {
        for(int i = l + 1; i <= r; i++) {
            Comparable e = arr[i];
            int j = i;
            for(;j > l && arr[j - 1].compareTo(e) > 0; j--) {
                arr[j] = arr[j - 1];
            }
            arr[j] = e;
        }
    }

}
